#include <stdio.h>
#include <signal.h>
#include <unistd.h>

volatile sig_atomic_t regular_signal_count = 0;
volatile sig_atomic_t real_time_signal_count = 0;

void handle_regular_signal(int signum) {
    printf("Received regular signal %d, count: %d\n", signum, ++regular_signal_count);
    // 延迟一段时间模拟信号处理函数执行时间
    sleep(1);
}

void handle_real_time_signal(int signum) {
    printf("Received real-time signal %d, count: %d\n", signum, ++real_time_signal_count);
    // 延迟一段时间模拟信号处理函数执行时间
    sleep(1);
}

int main() {
    // 注册信号处理函数
    signal(SIGUSR1, handle_regular_signal);
    struct sigaction sa_rt;
    sa_rt.sa_handler = handle_real_time_signal;
    sigemptyset(&sa_rt.sa_mask);
    sa_rt.sa_flags = SA_SIGINFO; // 对于实时信号，通常需要设置此标志
    sigaction(SIGRTMIN, &sa_rt, NULL);

    // 发送多个信号
    kill(getpid(), SIGUSR1);  // 发送常规信号SIGUSR1
    kill(getpid(), SIGUSR1);  // 短时间内再次发送同一种常规信号
    kill(getpid(), SIGRTMIN); // 发送实时信号SIGRTMIN
    kill(getpid(), SIGRTMIN); // 短时间内再次发送同一种实时信号

    while (1) {
        pause(); // 暂停进程，等待信号到来
    }

    return 0;
}